#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>



int addToTarget(int to,int from)
{
    int sum=0;
    //注意：这里用于测试写为i<from
    for(int i=to;i<from;i++)
    {
        sum+=i;
    }
    //return sum;
    exit(21);
}

int main()
{


    pid_t id = fork();
    if(id==0)
    {
        //int cnt = 10;
        int cnt = 5;
        while(cnt)
        {
            //子进程
            printf("我是子进程:%d,父进程:%d,cnt:%d\n",getpid(),getppid(),cnt--);
            sleep(1);
            //int a=10;
            //a/=0;
            int* p=NULL;
            *p=100;
        }
        //exit(0);
        exit(21);
    }
    //父进程
    //sleep(15);
    //pid_t ret = wait(NULL);
    //进程退出
    //1、代码完，结果对
    //2、代码完，结果不对
    //3、异常，代码没跑完，出异常了
    int status = 0;//不是整体使用的，是一个位图结构
    pid_t ret = waitpid(id,&status,0);
    if(id>0)
    {
        printf("wait sucess:%d,sig number:%d,child exit code:%d\n",ret,(status & 0x7F),(status>>8) & 0xFF);
    }
    sleep(3);


    //printf("hello world!");
    //sleep(2);
    //exit(31);//exit 库函数。退出进程，会刷新缓冲区
    // _exit(31);//_exit 系统调用。退出进程，不会刷新缓冲区
    //所以缓冲区是用户级的缓冲区

    //printf("hello world\n");
    //int ret=addToTarget(1,100);
    //printf("%d\n",ret);

    //for(int i=0;i<200;i++)
    // {
    //    //把退出码转化成对应的字符串描述
    //    printf("%d,%s\n",i,strerror(i));
    //}

    //写代码是为了完成某件事情，如何得知我的任务跑的如何呢？
    //进程退出码
    
    //计算1到100的求和
    //int num = addToTarget(1,100);
    //if(num==5050)
    //{
    //    return 0;
    //}
    //else{
    //    return 1;
    //}
    //如何设定main函数的返回值呢？如果不关心进程退出码，return 0 就行
    //如果未来我们是要关心进程退出码的时候要返回特定的数据表明特定的错误
    //退出码的意义：0：sucess !0 ：表示失败，!0具体是几，标识不同的错误--数字对人不友好，对计算机友好
    //所以，一般而言，退出码都必须有对应的退出码文字描述，1：可以是自定义 2：可以使用系统的映射关系（不太频繁）

    //进程退出的时候，对应的退出码
    //标定进程执行的结果是否正确
    //return 0;
}
